import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


# 1. 数据加载
file_path = '豆瓣电影Top250.csv'
data = pd.read_csv(file_path)

# 2. 数据清理

# 检查并删除“处理人”列（如果存在）
if '处理人' in data.columns:
    data_cleaned = data.drop(columns=['处理人'])
else:
    data_cleaned = data.copy()

# 删除含有缺失“主演”信息的行
data_cleaned = data_cleaned.dropna(subset=['主演'])

# 删除重复行
data_cleaned = data_cleaned.drop_duplicates()

# 3. 处理电影中文名称，只保留中文
data_cleaned['电影中文名'] = data_cleaned['电影中文名'].str.extract(r'([\u4e00-\u9fa5]+)')

# 4. 拆分“导演”和“主演”
data_cleaned[['导演', '主演']] = data_cleaned['导演'].str.split(' ', n=1, expand=True)

# 拆分“类型”列：提取“国家”和“类型”
data_cleaned[['国家', '类型']] = data_cleaned['类型'].str.split(' ', n=1, expand=True)

# 5. 处理评分人数列中的"人评价"去掉，并转化为数字
data_cleaned['评分人数'] = data_cleaned['评分人数'].str.replace('人评价', '').astype(int)

# 查看清理后的数据
print(data_cleaned.head())

# 6. 数据分析与可视化

# ① 使用评价数量区间分布绘制柱状图
bins = [0, 500000, 1000000, 2000000, 3000000, np.inf]
labels = ['0-500k', '500k-1M', '1M-2M', '2M-3M', '3M+'] # 定义区间标签（用于图表显示）
data_cleaned['评价人数区间'] = pd.cut(data_cleaned['评分人数'], bins=bins, labels=labels) # 使用pandas的cut函数将评分人数列划分为指定区间，并创建新的分类列

# 绘制柱状图
plt.figure(figsize=(8, 6))
data_cleaned['评价人数区间'].value_counts().sort_index().plot(kind='bar')
plt.title('评价数量区间分布')
plt.xlabel('评价人数区间')
plt.ylabel('电影数量')
plt.show()

# ② 使用电影的中文名称绘制词云图
# 使用本地字体路径创建词云图，背景色设置为白色
wordcloud = WordCloud(font_path='C:/Windows/Fonts/simhei.ttf', background_color='white').generate(' '.join(data_cleaned['电影中文名'].dropna()))

plt.figure(figsize=(10, 8))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title('中文电影名称词云图')
plt.show()

# ③ 使用评分TOP10的电影数据绘制表格
# 获取评分TOP10的电影
# 从清洗后的数据中选取评分最高的10部电影，并选择需要的列
top_10_rated = data_cleaned.nlargest(10, '评分')[['电影中文名', '评分', '评分人数', '上映年份']]

# 添加排名字段
top_10_rated['电影排名'] = range(1, 11)

# 调整表格列的顺序
top_10_rated = top_10_rated[['电影排名', '电影中文名', '评分', '评分人数', '上映年份']]
top_10_rated.to_csv('top_10_rated_movies.csv', index=False) #输出为csv文件
# 显示表格
print(top_10_rated)

# ④ 使用评论数TOP10的电影名称和评论数绘制条形图
top_10_comments = data_cleaned.nlargest(10, '评分人数')[['电影中文名', '评分人数']]

plt.figure(figsize=(10, 6)) # 设置图表大小
plt.barh(top_10_comments['电影中文名'], top_10_comments['评分人数'])
plt.xlabel('评论人数')
plt.title('评论数TOP10电影')
plt.show()
